import * as Cesium from "cesium";
import LayerBase from "./LayerBase.js";
import BaseEntity from "../graphic/entity/BaseEntity.js";

/**
 * Entity图层
 * @class EntityLayer
 */
class EntityLayer extends LayerBase {
  /**
   * 实体父对象
   * @private
   * @type {Cesium.Entity}
   */
  _parentEntity = null;

  /**
   * 实体列表
   * @private
   * @type {Array<Cesium.Entity>}
   */
  _entities = [];

  /**
   * 构造函数
   * @param {Object} options 配置选项
   * @param {Cesium.Viewer} options.viewer 场景viewer对象
   * @param {String} [options.id] 图层id，必须唯一，默认自动创建
   * @param {String} [options.name] 图层名称
   * @param {String} [options.remarks] 图层备注
   * @param {Boolean} [options.show=true] 图层是否显示
   */
  constructor(options) {
    // 默认配置选项
    const defaultOptions = {
      viewer: null,
      id: null,
      name: "",
      remarks: "",
      show: true,
    };
    // 初始化配置选项
    const _options = Object.assign({}, defaultOptions, options);
    super(_options);
    // 验证必需参数
    if (
      !this._options.viewer ||
      !(this._options.viewer instanceof Cesium.Viewer)
    ) {
      throw new Error("options.viewer is required");
    }
    // 初始化实体父对象,作为该图层下所有实体的父实体，以实现批量显隐控制
    this._parentEntity = this._viewer.entities.add(new Cesium.Entity());
  }

  /**
   * 获取或设置图层是否显示
   * @type {Boolean}
   */
  get show() {
    return this._show;
  }

  set show(value) {
    this._show = !!value;
    // 设置实体父对象的显示属性，实现批量显隐控制
    this._parentEntity.show = this._show;
  }

  /**
   * 添加实体
   * @param {Cesium.Entity} entity 实体对象
   */
  addEntity(entity) {
    if (!(entity instanceof Cesium.Entity)) {
      entity.parent = this._parentEntity;
      entity = new Cesium.Entity(entity);
      // 将实体添加到实体父对象下
      this._viewer.entities.add(entity);
      // 将实体添加到实体列表中
      this._entities.push(entity);
    }
  }

  /**
   * 添加实体
   * @param {BaseEntity} entity 实体对象
   */
  add(entity) {
    if (entity instanceof BaseEntity) {
      let cesiumEntity = entity.entity;
      cesiumEntity.parent = this._parentEntity;
      // 将实体添加到实体父对象下
      this._viewer.entities.add(cesiumEntity);
      // 将实体添加到实体列表中
      this._entities.push(cesiumEntity);
    }
  }

  /**
   * 移除实体
   * @param {BaseEntity} entity 实体对象
   */
  remove(entity) {
    if (entity instanceof BaseEntity) {
      let cesiumEntity = entity.entity;
      // 从实体父对象下移除实体
      this._viewer.entities.remove(cesiumEntity);
    }
  }

  /**
   * 移除所有实体
   */
  removeAll() {
    // 遍历实体列表，从实体父对象下移除所有实体
    for (let entity of this._entities) {
      this._viewer.entities.remove(entity);
    }
    // 清空实体列表
    this._entities = [];
  }
}
export default EntityLayer;
